gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/DSH_process.m
% function DSH_process() % 请从LTE_main_gui_final.m文件开始运行 % 下行共享信道数据生成 经过信道以及接收端处理 % % Author: 程式小组(徐萌 张妙 张晓庆) % Date: 2010-07-11 % ========================================================== % 仿真进度条 bar = WaitBar(0,'仿真开始>>>',gcf,550,320); LTE_schedule_subband % 此处只对用户分配到固定的子带上 minSNR = LTE_par.minSNR; deltaSNR = LTE_par.deltaSNR; maxSNR = LTE_par.maxSNR; nLoop = length(minSNR:deltaSNR:maxSNR); % 仿真SNR个数 totalSimu = LTE_par.nTime*nLoop; % 总计仿真次数 nTx = LTE_par.BS_par.nAnt; % BS 天线数 nRx = LTE_par.UE_par.nAnt; % UE 天线数 carrBand = LTE_par.carrBand; % 子载波带宽 通常取15KHz FFT_SIZE = LTE_par.FFT_SIZE; % FFT 变换点数 channelMod = LTE_par.channelMod; % ITU 信道模型 'PedA' 'PedB' 'VehA' 'VehB' channelFreq = LTE_par.channelFreq; % 添加信道类型 true:频域信道 false:时域信道 nUE = LTE_par.nUE; % 系统用户数 BLER = zeros(nUE,2,length(minSNR:deltaSNR:maxSNR)); % 用户误块率统计 th = zeros(nUE,2,length(minSNR:deltaSNR:maxSNR)); % 用户吞吐量统计 nSimu = LTE_par.nTime; % 仿真时间长度 iSNR = 1; for SNRdB = minSNR:deltaSNR:maxSNR SNRreal = 10^(0.1*SNRdB); disp('iSNR') disp(SNRdB) for iSimu = 1:nSimu str = sprintf('当前进行信噪比 %4.2f dB下第 %d 次仿真>>>',SNRdB,iSimu); WaitBar(((iSNR-1)*LTE_par.nTime+iSimu)/totalSimu,bar,str); % ===================== 发端过程 ========================== % 顺序为每个用户产生发送数据并完成基站端处理过程 for iUE = 1:nUE % 基站的基带处理函数,该函数仅用户数据信道,PDSCH处理流程为: % 产生信息-->CRC校验-->码块分割-->turbo编码-->速率匹配 % -->加扰-->层映射-->预编码-->子载波映射-->OFDM调制-->天线映射 % 根据时域信道或频域信道,输出sendSymb代表时域符号或频域载波映射后符号 sendSymb = send_process(iUE); % 发端多个用户信号叠加 if iUE == 1 sendSymbAll = zeros(size(sendSymb)); end sendSymbAll = sendSymbAll+sendSymb; end [Hcell h] = gen_channel(nTx,nRx,FFT_SIZE,channelFreq,channelMod,carrBand); [recSymb,Hcell] = channel(sendSymbAll,Hcell,h,SNRdB); % ====================== 收端过程 ========================== % 顺序检测每个用户信号并完成UE端处理过程 for iUE = 1:nUE % UE的基带处理函数,该函数仅用于数据信道,PDSCH在收端处理流程为: % 天线逆映射-->OFDM解调-->去子载波映射-->去预编码 MIMO检测--> % 去层映射-->解扰-->去速率匹配-->turbo译码-->CRC校验B-->CRC校验A % 输出为第iUE个用户可用TB正确、错误接收指示 err = rec_process(recSymb,Hcell,h,iUE,SNRdB); for n =1:length(err) if err(n) % 误块率统计 此处只记录一个UE的最多两个TB的误块率情况 BLER(iUE,n,iSNR) = BLER(iUE,n,iSNR)+err(n); str = sprintf('第 %d个用户本次数据传输 TB%d 出错',iUE,n-1); disp(str); else % 吞吐量统计 此处只记录一个UE的最多两个TB的吞吐量情况 th(iUE,n,iSNR) = th(iUE,n,iSNR)+LTE_par.UE_par.sizeTB(n,iUE); str = sprintf('第 %d个用户本次数据传输 TB%d 正确',iUE,n-1); disp(str); end end end sendSymbAll = []; % 发端数据清零 end iSNR = iSNR+1; end BLER = BLER/nSimu; % 频谱效率计算 单位为bit/s/Hz for iUE = 1:nUE th(iUE,:,:) = th(iUE,:,:)./(nSimu/1000)/(LTE_par.UE_par.nRB(iUE)*LTE_par.scPerRB*15000); end WaitBar(1,bar,'仿真结束!!!'); pause(2); WaitBar(0,bar,''); BLERUE1 = reshape(BLER(1,1,:),1,iSNR-1); % ====================== 画图 =============================== % % 输出误块率随SNR变化曲线 % figure % BLERUE1 = reshape(BLER(1,1,:),1,iSNR-1); % semilogy(minSNR:deltaSNR:maxSNR,BLERUE1),grid on % % 输出频谱效率随SNR变化曲线 % figure % thUE1 = reshape(th(1,1,:),1,iSNR-1); % plot(minSNR:deltaSNR:maxSNR,thUE1),grid on % % 将信噪比 误块率 频谱效率保存成 mat类型文件 % SNR = minSNR:deltaSNR:maxSNR; % savedata(LTE_par.UE_par.IMCS(1),SNR,BLER,th,BLERUE1,thUE1);